//在类型函数的形参或者返回值，或者类的属性类型不明确的时候我们可以使用泛型

function f1<T>(num: T): T {
    return num
}

console.log(f1(3)) //利用ts自动对类型推断
console.log(f1<string>('hhh'))//指定泛型


function f2<T, K>(num: T, str: K): T {
    console.log(str)
    return num
}
console.log(f2(3, 'djasd')) //利用ts自动对类型推断
console.log(f2<string, number>('hhh', 3434))//指定泛型

interface inter {
    length: number
}
function f3<T extends inter>(a: T) {
    return console.log(a.length)
}

f3('123132')
f3({ length: 12 })

class F4<T>{
    constructor(public a: T) {
    }
}

const r = new F4('a')
console.log(typeof r.a)

const c = new F4(12)
console.log(typeof c.a)